package com.gmrz.uap.role;

import com.gmrz.uap.cfg.SystemConst;
import com.gmrz.uap.common.ServiceSupport;
import com.gmrz.uap.model.ResourceRole;
import com.gmrz.uap.model.Role;
import com.gmrz.uap.util.Identities;
import com.jfinal.aop.Before;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.tx.Tx;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

public class RoleService extends ServiceSupport {

    private static final Logger LOG = LoggerFactory.getLogger(RoleService.class);
    public static final RoleService me = new RoleService();

    /**
     * 根据页面传过来的条件进行分页查询
     *
     * @param role  角色信息
     * @param page  页号
     * @param rows  行数
     * @param sort  排序字段
     * @param order 升序/降序
     * @return　分页结果 Page<Role>
     */
    public Page<Role> findRoleListForPaginate(Role role, int page, int rows, String sort, String order) {
        return Role.dao.findListForPaginate(role, page, rows, sort, order);
    }

    /**
     * 增加角色信息
     *
     * @param role 角色信息
     * @return true/false
     */
    public boolean save(Role role) {
        role.setRoleId(Identities.uuid2());
        return role.save();
    }

    /**
     * 修改角色信息
     *
     * @param role 角色信息
     * @return true/false
     */
    public boolean update(Role role) {
        return role.update();
    }

    /**
     * 根据参数删除角色信息，ID可以是多个，中间使用逗号隔开
     *
     * @param ids ID集合
     * @return true/false
     */
    @Before(Tx.class)
    public boolean remove(String ids) {

        String[] idArr = ids.split(SystemConst._DEFAULT_SEPARATOR_COMMA);

        if (idArr.length == 0) {
            return false;
        }

        for (String id : idArr) {
            flag = RoleService.me.hasResourceRole(id);

            if (flag) {
                try {
                    RoleService.me.removeByRoleId(id);
                } catch (RoleException e) {
                    LOG.error("根据角色ID删除资源信息",e);
                    break;
                }
            }

            flag = Role.dao.deleteById(id);
            if (!flag) {
                break;
            }
        }

        return flag;
    }

    /**
     * 根据ID获取角色信息
     *
     * @param id 主键
     * @return Role 角色信息
     */
    public Role findOne(String id) {
        return Role.dao.findById(id);
    }

    /**
     * 根据角色名判断角色是否存在
     *
     * @param name 角色名
     * @return true/false
     */
    public boolean exist(String name) {
        Role role = Role.dao.getRoleByName(name);
        return null == role;
    }

    /**
     * 添加角色资源关系数据
     *
     * @param resourceRole 角色资源信息
     * @return 是否成功
     */

    public boolean roleResourceSave(ResourceRole resourceRole) throws RoleException {
        return resourceRole.save();
    }

    /**
     * 根据角色ID删除资源关联关系
     *
     * @param roleId 角色ID
     * @return 是否成功
     */
    public boolean removeByRoleId(String roleId) throws RoleException {
        return ResourceRole.dao.deleteByRoleId(roleId) > 0;
    }


    public List<Role> findByUserId(String userId) {
        return Role.dao.findByUserId(userId);
    }

    /**
     * 判断指定角色是否关联资源
     *
     * @param roleId 角色id
     * @return
     */
    public boolean hasResourceRole(String roleId) {
        List<ResourceRole> resourceRoleList = ResourceRole.dao.findByRoleId(roleId);
        return !resourceRoleList.isEmpty();
    }

    public List<Role> findAll() {
        return Role.dao.find("select * from t_role");
    }

    public List<Role> getRoleListByUserId(String userId) {
        return Role.dao.getRoleListByUserId(userId);
    }

}
